package com.jackstraw.jack_base.mq.rocketmq.aspect.annotation;

import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.SelectorType;
import org.springframework.stereotype.Component;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Component
@Documented
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface RocketMQMessageListener {

    /**
     * 要使用的serverName
     *
     * @return
     */
    String serverName() default "";

    /**
     * 相同角色的使用者需要拥有完全相同的订阅和consumerGroup，以正确实现负载平衡。 这是必需的，并且需要是全局唯一的。
     * <p>
     * Consumers of the same role is required to have exactly same subscriptions and consumerGroup to correctly achieve
     * load balance. It's required and needs to be globally unique.
     * <p>
     * <p>
     * See <a href="http://rocketmq.apache.org/docs/core-concept/">here</a> for further discussion.
     */
    String consumerGroup();

    /**
     * Topic name.
     */
    String topic();

    /**
     * 控制如何选择消息。
     * <p>
     * Control how to selector message.
     *
     * @see SelectorType
     */
    SelectorType selectorType() default SelectorType.TAG;

    /**
     * 控制可以选择的消息。
     * <p>
     * Control which message can be select. Grammar please see {@link SelectorType#TAG} and {@link SelectorType#SQL92}
     */
    String selectorExpression() default "*";

    /**
     * 控制消费模式，您可以选择并发或有序接收消息。
     * <p>
     * Control consume mode, you can choice receive message concurrently or orderly.
     */
    ConsumeMode consumeMode() default ConsumeMode.CONCURRENTLY;

    /**
     * 控制消息方式，如果想让所有订阅者收到所有消息，广播是一个不错的选择。
     * <p>
     * Control message mode, if you want all subscribers receive message all message, broadcasting is a good choice.
     */
    MessageModel messageModel() default MessageModel.CLUSTERING;

    /**
     * 最大消费者线程号。
     * <p>
     * Max consumer thread number.
     */
    int consumeThreadMax() default 64;

    /**
     * 一条消息可能阻塞正在消费的线程的最大时间(以分钟为单位)。
     * <p>
     * Maximum amount of time in minutes a message may block the consuming thread.
     */
    long consumeTimeout() default 15L;

    /**
     * “access-key”的属性。
     * <p>
     * The property of "access-key".
     */
    String accessKey() default "";

    /**
     * “secret-key”的属性。
     * <p>
     * The property of "secret-key".
     */
    String secretKey() default "";

    /**
     * 消息跟踪的Switch标志实例的属性。"secret-key"。
     * <p>
     * Switch flag instance for message trace.
     */
    boolean enableMsgTrace() default true;

    /**
     * 消息跟踪主题的名称值。 如果不配置，则可以使用默认跟踪主题名称。
     * The name value of message trace topic.If you don't config,you can use the default trace topic name.
     */
    String customizedTraceTopic() default "";

    /**
     * name-server的属性。
     * <p>
     * The property of "name-server".
     */
    String nameServer() default "";

    /**
     * “access-channel”的属性。
     * <p>
     * The property of "access-channel".
     */
    String accessChannel() default "";
}